//import "java.awt.*"; import "javax.swing.*";  
//import "java.awt.event.*"; import "java.awt.geom.*";
//import "java.awt.image.*"; 
//
///*
//  SpellSequencePanel.java
//    (c)1999-2005 SSC Development Team
//  Functions: 
//  -Running Spellcasting Animations.
//  Allowed Dependencies: Buffer.java, Entity.java
//*/
//
//@implementation 
//SpellSequencePanel JPanel implements ActionListener
//{
//  Entity a; //Attacking entity
//  Entity[] d; //Defending entities
//  Spell s;  //Spell being used
//  Image bg;
//  Image[] att_frames;
//  Image[] def_frames;
//  
//  int frame = 0; //Current frame
//  
//  //frame mapping for attack animations
//  int curfr = 0;
//  //defender index tracker
//  int curdef = 0;
//  
//  int maxframe = 4; //Starts out at 3 for normal sequences
//
//  /* Idea: increase maxframe for counterattacks and the like! 
//   * Or: Switch the entities and start out at frame 0 again O_O. 
//   */
//  
//  Timer timer = new Timer(Buffer.TimerDelay, this); //Timer delay.TWEAKABLE
//  
//  char type; //var to indicate the type of spell attack.
//  
//  int expGained = 0;
//  int levelGained = 0;
//  
//  //memory vars for levelup.
//  int oldmaxhp = 0;
//  int oldavdam = 0;
//  
//  int intensity = 0; //amount of damage or points healed
//  
//  /* Constructor for default attack */
//  public SpellSequencePanel(Entity a, Entity d, Spell s) 
//  {
//    super(true);
//    
//    bg = Lib_Image.getImage(Stats.getTileBattleBackground(d.x/24, d.y/24));
//    att_frames = new Image[a.img_attack.length];
//    for(int i = 0; i < a.img_attack.length; i++) {
//      att_frames[i] = a.img_attack[i];
//    }  
//    
//    this.a = a;
//    
//    /* Scan map for entities within spell effect area */
//    int[] adj_ents = Buffer.getAdjacentEnts(d, -1, s.area_size-1, false);
//    
//    /* Make a list of affected entities */
//    this.d = new Entity[adj_ents.length];
//    for(int i=0; i<adj_ents.length; i++) {
//      this.d[i] = Buffer.getEnt(adj_ents[i]);
//    }  
//    
//    /* Load & Mirror Defender frames */
//    def_frames = new Image[adj_ents.length];
//    
//    for(int i=0; i<adj_ents.length; i++) {
//
//      def_frames[i] = this.d[i].img_attack[0];
//      
//      AffineTransform tx = AffineTransform.getScaleInstance(-1.0, 1.0); 
//      tx.translate(-def_frames[i].getWidth(null), 0);
//      AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
//    
//      def_frames[i] = op.filter(Lib_Image.toBufferedImage(def_frames[i]), null);
//    }  
//    // Dirty !
//    while(def_frames[adj_ents.length-1].getWidth(null) < 0) {    }
//    
//    /* Load spell */
//    this.s = s;
//    frame = 0;
//       
//    setType();
//    
//    startAnimation();  
//  }
//  
//  private void setType()
//  {
//    /* define effect type here */
//    if(s.effect.equals("Heal")) { type = 'h'; }
//    if(s.effect.equals("Normal Damage")) { type = 'd'; }
//    if(s.effect.equals("Fire Damage")) { type = 'd'; }
//    if(s.effect.equals("Lightning Damage")) { type = 'd'; }
//  }
//  
//  public boolean Update() {   
//    boolean running = true; 
//    
//    if(frame < maxframe-3) {
//      curfr++;
//      curfr = curfr%att_frames.length;
//    }
//    
//    
//    frame++;    
//        
//    this.paint(this.getGraphics()); 
//    
//      
//    if(frame == maxframe-2) {
//      
//      //do spell effect here
//      int oldhp = d[curdef].curhp;
//      
//      d[curdef] = s.doEffect(d[curdef]);
//      if(curdef<1) { a.curmp -= s.mp_cost; }
//      if(a.curmp < 0) { System.out.println("Stoopid development error in SpellSequence class. Mail devlyn about this blooper ;)."); }
//      
//      intensity += Math.abs(d[curdef].curhp - oldhp);
//            
//      if(d[curdef].curhp < 1) { //Opponent dies? Then we have a KILL!
//          type = 'k';
//      }
//      //Add other status types :).
//      
//           
//    }
//    
//    
//    //Repeat animation for multiple targets!
//    if(curdef<d.length-1 && frame == maxframe-1) {
//      curdef++; frame -= 2; intensity = 0; 
//      setType();
//      }
//    
//    
//    if(frame == maxframe-1 && a.classname != null) {
//      expGained = intensity*a.level; //calcSpellExp(d,intensity,type);
//      a.exp += expGained;
//    }
//    
//    if(frame == maxframe) {
//      if(Stats.checkLevelUp(a)) {
//        levelGained = 1;
//        oldmaxhp = a.maxhp;
//        oldavdam = a.mindam + (a.damran/2);
//        
//        Stats.levelupEntity(a);
//      }
//    }  
//    
//    this.paint(this.getGraphics());    
//        
//    if(frame > maxframe-1) {
//      stopAnimation();
//      running = false;
//    }  
//    return(running);
//  }
//  
//  public boolean Force() { //Force animation updates by pressing 's' or 'd' key!
//    if(frame > maxframe-1) { return(false); }
//    if(frame > maxframe-3) { Update(); }
//    
//    return(true);
//  }
//  
// 
//-(void) paintComponent(Graphics g) {
//    ((Graphics2D) g).scale(Buffer.ScaleRatio,Buffer.ScaleRatio);
//    
//    g.setColor(new Color(0,0,0));
//    
//    g.fill3DRect(0,0,360,240,true);
//    
//    g.drawImage(bg,0,40,this);
//    
//    g.drawImage(def_frames[curdef],5,170-def_frames[curdef].getHeight(this),this);
//    
//    int sp = Buffer.AnimDelay/5;
//    
//    /* Spell animations! */
//    if(s.animation_type.equals("Flashing Above")) {   
//      if(frame == 1 && (anim_iterator/sp)%2 == 1) {
//        g.drawImage(s.spellImage.elementAt(0),40,30,this);      
//      }  
//    }
//    if(s.animation_type.equals("Two-Frame Base")) {   
//      if(frame == 1 && (anim_iterator/sp)%2 == 1) {
//        g.drawImage(s.spellImage.elementAt(0),14,144,this);      
//      }
//      else {
//        g.drawImage(s.spellImage.elementAt(1),14,144,this);
//      }  
//    }
//    if(s.animation_type.equals("Three-Frame Base")) {   
//      if(frame == 1 && (anim_iterator/sp)%3 == 1) {
//        g.drawImage(s.spellImage.elementAt(2),4,124,this);      
//      }
//      else if(frame == 1 && (anim_iterator/sp)%3 == 2) {
//        g.drawImage(s.spellImage.elementAt(1),4,124,this);      
//      }
//      else {
//        g.drawImage(s.spellImage.elementAt(0),4,124,this);
//      }  
//    }
//    if(s.animation_type.equals("Three-Frame Above")) {   
//      if(frame == 1 && (anim_iterator/sp)%3 == 1) {
//        g.drawImage(s.spellImage.elementAt(2),4,0,this);      
//      }
//      else if(frame == 1 && (anim_iterator/sp)%3 == 2) {
//        g.drawImage(s.spellImage.elementAt(1),4,0,this);      
//      }
//      else if(frame == 1){
//        g.drawImage(s.spellImage.elementAt(0),4,0,this);
//      }  
//    }
//      
//    g.drawImage(att_frames[curfr],355-att_frames[curfr].getWidth(this),185-att_frames[curfr].getHeight(this),this);
//    //g.drawImage(def_frame,350-def_frame.getWidth(this),40,this);
//    
//    Lib_Image.targetStatBox(g, d[curdef]);
//    Lib_Image.playerStatBox(g);
//       
//    if(frame < maxframe-2) {
//      Lib_Image.battleBox(g,a.name+" casts "+s.name+"...","","");
//    }
//    else if(frame == maxframe-2) {
//      if(type == 'h') {
//        Lib_Image.battleBox(g,a.name+" casts "+s.name+" on "+d[curdef].name+"...","...and heals "+intensity+" hit points!","");
//      }  
//      else if(type == 'd') {
//        Lib_Image.battleBox(g,a.name+" casts "+s.name+" on "+d[curdef].name+"...","...and inflicts "+intensity+" damage!","");
//      }      
//      else if(type == 'm') {
//        Lib_Image.battleBox(g,a.name+" casts "+s.name+"...","...but "+d[curdef].name+" is unaffected!","");
//      }
//      else if(type == 'k') {
//        Lib_Image.battleBox(g,a.name+" casts "+s.name+"...","...and inflicts "+intensity+" damage!",d[curdef].name+" dies in honor...");
//      }
//    }  
//    else if(frame == maxframe-1) {
//      Lib_Image.battleBox(g,a.name+" gains "+expGained+" exp.","","");
//    }  
//    else if(frame == maxframe) {
//      if(levelGained == 0) {
//        Lib_Image.battleBox(g,a.name+" gains no level.","","");
//      }  
//      else {
//        Lib_Image.battleBox(g,a.name+" becomes level "+a.level+".",
//                            "Max HP increases by "+(a.maxhp-oldmaxhp),
//                            "Average Damage increases by "+(a.mindam+(a.damran/2)-oldavdam));
//      }
//    }
//    
//  }    
//  
//  public synchronized void startAnimation() {
//    timer.start();
//  }
//
//  public synchronized void stopAnimation() {
//    timer.stop();
//  }
//  
//  private int anim_delay = Buffer.AnimDelay*4; //Animation delay per frame. TWEAKABLE
//  private int anim_iterator = 0;
//
// -(void) actionPerformed(ActionEvent e) {     
//    //tile & sprite animation
//    anim_iterator++;
//    if(frame != 1) {
//      if(anim_iterator>=anim_delay) {
//        anim_iterator = 0;
//        Update();      
//      }
//    }
//    else {
//      if(anim_iterator>=Buffer.AnimDelay*10) {
//        anim_iterator = 0;
//        Update();      
//      }
//      if(anim_iterator%Buffer.AnimDelay == 1) {
//        this.paint(this.getGraphics());
//      }
//    }  
//  }
//}  